package top3.Divorce;

import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * @desc: 需求:找出美国疫情数据中，每年years的结婚登记数最多的省province前3个。Top3问题。
 * 分析：
 * 自定义对象，在map阶段将“年years和累计结婚登记数marriages”作为key输出，重写对象的排序规则，
 * 首先根据年years的正序排序，如果年相等，按照结婚登记数marriages倒序排序，发送到reduce。
 * 在reduce端利用自定义分组规则，将年years相同的分为一组，然后遍历取值，取出每组中的前3个即可。
 * 为了验证验证结果方便，可以在输出的时候以marriages作为value，实际上为空即可，value并不实际意义。
 */
public class DivorceTop3Mapper extends Mapper<LongWritable, Text, DivorceTop3Bean,FloatWritable> {

    DivorceTop3Bean outKey = new DivorceTop3Bean();
    FloatWritable outValue = new FloatWritable();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //i++;
        //if (key.get() == 0){
        //    return;
        //}
        String[] fields = value.toString().split("\t");
        //封装数据： 年份 省份 结婚登记数
        //2007年	云南省	35.09
        String years = fields[0];
        String province = fields[1];
        float divorce = Float.parseFloat(fields[2]);

        outKey.set(years,province,divorce);
        outValue.set(divorce);

        context.write(outKey,outValue);
    }
}
